package org.seedltd.upms.controller.sys;


import lombok.AllArgsConstructor;
import org.seedltd.core.base.BaseController;
import org.seedltd.core.utils.Assert;
import org.seedltd.core.validation.Save;
import org.seedltd.core.validation.Update;
import org.seedltd.log.annotation.SysLog;
import org.seedltd.upms.model.sys.common.SelectTreeVO;
import org.seedltd.upms.model.sys.form.SysDeptForm;
import org.seedltd.upms.model.sys.form.SysDeptSearchForm;
import org.seedltd.upms.model.sys.vo.SysDeptVO;
import org.seedltd.upms.service.sys.SysDeptService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 部门管理控制器
 *
 * @author laizuan
 * @version 1.0
 * @since 2021/07/19
 */
@RestController
@AllArgsConstructor
@RequestMapping("/sysDept")
public class SysDeptController extends BaseController<SysDeptService> {

    /**
     * 新增
     *
     * @param form 部门管理表单数据
     * @return 部门管理主键
     */
    @SysLog("新增部门")
    @PostMapping(value = "/add")
    @PreAuthorize("hasAuthority('sys:dept:add')")
    public Long add(@RequestBody @Validated({Save.class}) SysDeptForm form) {
        return baseService.add(form);
    }

    /**
     * 获取详情
     *
     * @param deptId 部门管理主键
     * @return 部门管理
     */
    @GetMapping(value = "/get")
    public SysDeptVO get(Long deptId) {
        Assert.notNull(deptId, "参数不能为空");
        return baseService.findById(deptId);
    }


    /**
     * 修改
     *
     * @param form 部门管理表单数据
     * @return 修改状态。true标识修改成功，false标识修改失败
     */
    @SysLog("修改部门")
    @PostMapping(value = "/update")
    @PreAuthorize("hasAuthority('sys:dept:update')")
    public boolean update(@RequestBody @Validated({Update.class}) SysDeptForm form) {
        Assert.notNull(form.getDeptId(), "修改数据ID不能为空");
        return baseService.update(form);
    }

    /**
     * 删除
     *
     * @param deptId 部门管理主键
     * @return 删除状态。true标识修改成功，false标识修改失败
     */
    @SysLog("删除部门")
    @GetMapping(value = "/delete")
    @PreAuthorize("hasAuthority('sys:dept:delete')")
    public boolean delete(Long deptId) {
        Assert.notNull(deptId, "ID不能为空");
        return baseService.delete(deptId);
    }

    /**
     * 列表
     *
     * @param searchForm 查询条件
     * @return 部门管理列表集合
     */
    @PostMapping(value = "/list")
    public List<SysDeptVO> page(@RequestBody SysDeptSearchForm searchForm) {
        return baseService.list(searchForm);
    }

    /**
     * 获取下拉树部门数据
     *
     * @return
     */
    @GetMapping("/selectTreeDept")
    public List<SelectTreeVO> selectTreeMenu() {
        return baseService.listSelectTreeDept();
    }
}